from DNA import DNA_lcq
from GeneticAlgorithm import GeneticAlgorithm
import matplotlib.pyplot as plt  
import numpy as np


# 适应度函数
# 这里以二次函数求最小值为例： y = -2 * x * x + 1 * x + 2
def fun(array):
    # 接收一个 1 * n 的列表
    # 存放自变量的值
    # 这里只有一个自变量，故array = [x]
    x = array[0]

    ans = -2 * x * x + 1 * x + 2

    if x < 1:
        ans -= 100

    return ans


# 超参数
# goal_fun:             目标函数 (默认求最大值)
# parameter_range:      参数的约束范围（左右闭区间）
# parameter_accuracy:   各个参数精度（总共多少种可能）
# crossover_p:          交叉概率
# variation_p:          变异概率
# coding_mode:          编码方式
# max_epoch:            最大迭代次数
# population_size:      种群个数


n = 1  # 尺寸
left = -100  # 下限（闭区间）
right = 100  # 上限 （闭区间）

parameter = {"goal_fun": fun,
             "parameter_range": [[left, right] * n],
             "parameter_accuracy": None,
             "crossover_p": 0.7,
             "variation_p": 0.5,
             "coding_mode": DNA_lcq,
             "max_epoch": 1000,
             "population_size": 15}

# 这里默认是最大值优化，如果需要最小值优化，则需要对fun函数的结果乘以 -1
Gene = GeneticAlgorithm(parameter)
ans = Gene.go(log=True)  # log为False则不打印日志
print("最优解为：", ans)  # 走！
print("对应结果为：", fun(ans))
